/**
 * @file liquidity_taker.cpp
 * @brief 流动性吸纳策略类的实现
 * 
 * @details 该文件实现了流动性吸纳策略类，该策略基于市场交易信息和特征引擎计算的特征，
 * 在特定条件下主动发送订单以吸纳市场流动性。当前文件主要实现了构造函数，
 * 其中包括将策略的回调函数注册到交易引擎中的逻辑。
 * 
 * @author 原作者
 * @date 2023
 */

#include "liquidity_taker.h"

#include "trade_engine.h"

namespace Trading {
  /**
   * @brief 构造函数的实现
   * 
   * @details 初始化流动性吸纳策略对象，设置必要的组件和配置，并将策略的回调函数注册到交易引擎中。
   * 具体流程如下：
   * 1. 初始化类成员变量，包括特征引擎指针、订单管理器指针、日志记录器和交易配置
   * 2. 将策略的订单簿更新回调函数注册到交易引擎中
   * 3. 将策略的交易更新回调函数注册到交易引擎中
   * 4. 将策略的订单更新回调函数注册到交易引擎中
   * 
   * 这样，当交易引擎收到相应的事件时，就会调用策略的相应方法进行处理。
   * 
   * @param logger 日志记录器指针，用于记录策略执行过程和结果
   * @param trade_engine 交易引擎指针，用于注册策略的回调函数
   * @param feature_engine 特征引擎指针，用于获取策略所需的特征值
   * @param order_manager 订单管理器指针，用于发送和管理策略的订单
   * @param ticker_cfg 交易配置映射，包含每个证券的交易参数（如阈值、批量等）
   */
  LiquidityTaker::LiquidityTaker(Common::Logger *logger, TradeEngine *trade_engine, const FeatureEngine *feature_engine,
                                 OrderManager *order_manager,
                                 const TradeEngineCfgHashMap &ticker_cfg)
      : feature_engine_(feature_engine), order_manager_(order_manager), logger_(logger),
        ticker_cfg_(ticker_cfg) {
    trade_engine->algoOnOrderBookUpdate_ = [this](auto ticker_id, auto price, auto side, auto book) {
      onOrderBookUpdate(ticker_id, price, side, book);
    };
    trade_engine->algoOnTradeUpdate_ = [this](auto market_update, auto book) { onTradeUpdate(market_update, book); };
    trade_engine->algoOnOrderUpdate_ = [this](auto client_response) { onOrderUpdate(client_response); };
  }
}
